package Voraces;

import java.util.ArrayList;
import java.util.List;

import DivideyVenceras.Cosas;
import dyv.Herramientas;

public class Carretilla {

	private int [] pesos; //pesos a transportar en la carretilla
	private int [] pesosactualizados; //pesos a transportar en la carretilla
	private int pesoMax; //peso maximo a transportar

	public Carretilla(int numElementos,int pesoMax){
		this.pesoMax=pesoMax;
		pesos=generarAleatorio(numElementos,pesoMax);
	}

	public int getPesoMax(){
		return pesoMax;
	}

	public void setPesoMax(int pesoMax){
		this.pesoMax=pesoMax;
	}

	public int [] getPesos(){
		return pesos;
	}

	public void regenerarPesos(){ //se generan con el mismo numero de elementos que habia
		pesos=generarAleatorio(pesos.length,pesoMax);
	}

	public void regenerarPesos(int numElementos){
		pesos=generarAleatorio(numElementos,pesoMax);
	}

	public String transportar(){
		int [] solucion; //numero de viaje
		int numViaje=0;
		String sol="Viajes de la carretilla\n";

		Cosas.quicksort(pesos,0,pesos.length-1); //ordenamos segun el peso
		solucion=carretillaVoraz();
		//pesosactualizados= (int)(pesos.lenght);
		for(int i=0;i<solucion.length;i++){
			if(numViaje<solucion[i]) 
				numViaje=solucion[i];
			//sol+="Objeto ("+i+") con peso "+pesosactualizados.get(i)+" transportado en el viaje numero "+solucion[i]+"\n";
		}
		sol+="\nTotal de viajes: "+numViaje+"\n";
		return sol;
	}

	private  int [] carretillaVoraz(){
		int n=pesos.length; 
		int j=pesos.length-1;
		int viaje=1;
		int capacidad=pesoMax;
		int [] carreSol=new int[pesos.length]; 
		ArrayList pesosElegidos=new ArrayList();
		//incializacion a 0 
		for(int i=0;i<carreSol.length;i++){
			carreSol[i]=0;
		}

		
		while(n!=0){ //Funcion Solucion
			if((pesos[j]<=capacidad)&&(carreSol[j]==0)&&((repetido(pesosElegidos,pesos[j]))==false)) { //Funcion Factible
				pesosElegidos.add(pesos[j]);
				capacidad-=pesos[j];
				//pesosactualizados.add(pesos[j]);
				carreSol[j]=viaje; //se indica el numero del viaje en el que se transporta
				n--;
			}

			if(j==0 || capacidad==0){ //se comprueba si hay que hacer el viaje
				capacidad=pesoMax; //se hace otro viaje
				j=pesos.length-1;
				viaje++;
				pesosElegidos.clear();
			}
			j--; //siguiente objeto con menor peso
		}
		return carreSol;
	}

	//Generamos los pesos de la carretilla
	private int [] generarAleatorio(int n,int max){
		int [] elementos=new int[n];

		for(int i=0;i<elementos.length;i++)
			elementos[i]=(int)(Math.random()*max+1);

		return elementos;
	}

	public String toString(){
		String a="\nCarretilla con el peso maximo: "+pesoMax+"\n";
		a+="**\nObjetos que se van a transportar:\n";
		for(int i=0;i<pesos.length;i++){
			a+="Objeto ("+i+") con peso "+pesos[i]+"\n";
		}
		a+="**\n";
		return a;
	}
	public boolean repetido( ArrayList vector ,int num){
		boolean repetido = false;
		if(vector.contains(num))
				repetido=true;
		return repetido;
	}
	
}

